#ifndef POOLINFO_H
#define POOLINFO_H
#include <QString>

/**
 * @file poolvisualizer.h
 * @brief 内存池可视化组件
 *
 * 数据流动路径：
 * 1. 内存池操作 (allocate/deallocate)
 *    ↓
 * 2. MemoryPool 内部状态更新 (Block/Slot 变化)
 *    ↓
 * 3. HashBucket::getPoolStatus() 调用 MemoryPool 的统计方法
 *    ↓
 * 4. PoolStatus 结构体被填充 (从内存池获取数据)
 *    ↓
 * 5. PoolVisualizer 调用 HashBucket 的方法获取状态
 *    ↓
 * 6. PoolStatus::getStatusText() 格式化显示
 *    ↓
 * 7. UI显示或 QDebug 输出到终端
 *
 * 设计原则：
 * - PoolStatus: 纯数据结构，完全解耦
 * - PoolVisualizer: 可视化工具，通过 HashBucket 获取数据
 * - HashBucket: 数据提供者，封装内存池访问逻辑
 */

struct PoolStatus{
    int poolIdx = -1;
    int slotSize = 0;
    int blockSize = 0;
    int blockCnt = 0;
    int totalSlotCnt = 0;
    int freeSlotCnt = 0;
    int usedSlotCnt = 0;

    // 辅助方法
    // 状态判断
    bool isValid() const { return poolIdx >= 0; }
    bool isInitialized() const { return slotSize > 0; }
    bool isEmpty() const { return usedSlotCnt == 0; }
    bool isFull() const { return freeSlotCnt == 0 && totalSlotCnt > 0; }
    bool hasFreeSlots() const { return freeSlotCnt > 0; }

    // 字符串输出（用于UI显示和调试）
    QString getPoolStatus() const {
        if (!isInitialized()) {
            return QString("池%1 (%2B) | 未初始化").arg(poolIdx).arg(slotSize);
        }

        // 计算使用率
        double usageRate = totalSlotCnt > 0 ? (double)usedSlotCnt / totalSlotCnt * 100 : 0;
        
        return QString("池%1 (%2B) | 块%3 状态:%4 已用 %5/%6 槽 (%7%)")
            .arg(poolIdx)
            .arg(slotSize)
            .arg(blockCnt)
            .arg(getPoolState())
            .arg(usedSlotCnt)
            .arg(totalSlotCnt)
            .arg(usageRate, 0, 'f', 1);
    }
    // 状态描述
    QString getPoolState() const {
        if (!isValid()) return "无效";
        if (isEmpty()) return "空闲";
        if (isFull()) return "已满";
        return "正常";
    }
};

/**
 * ============================================================================
 * 任务信息结构体 - 未来扩展方案：配置表驱动设计
 * ============================================================================
 * 
 * 当前使用硬编码结构体，未来可考虑配置表方案：
 * 
 * 优势：
 * - 字段可动态添加，无需重新编译
 * - 支持多语言和主题定制
 * - 便于线程池集成时的字段扩展
 * 
 * 配置表示例：
 * {
 *   "task_fields": [
 *     {"name": "taskId", "type": "int", "display": "任务ID", "width": 60},
 *     {"name": "memSize", "type": "size_t", "display": "内存大小", "width": 80, "unit": "B"},
 *     {"name": "ptr", "type": "void*", "display": "指针", "width": 100, "visible": false},
 *     {"name": "poolIndex", "type": "int", "display": "池索引", "width": 60},
 *     {"name": "timestamp", "type": "QString", "display": "时间", "width": 100},
 *     {"name": "threadId", "type": "int", "display": "线程ID", "width": 80},
 *     {"name": "allocTime", "type": "double", "display": "分配时间", "width": 100, "unit": "ms"}
 *   ]
 * }
 * 
 * 适用场景：
 * - 线程池频繁升级，字段经常变化
 * - 需要多环境不同配置
 * - 用户需要自定义显示字段
 * - 国际化需求
 * 
 * 当前阶段：先用结构体快速实现，功能稳定后再考虑配置表重构
 */
struct TaskInfo {
    int taskId = -1;           // 任务ID
    size_t memSize = 0;       // 内存大小
    void* allocatedPtr = nullptr;           // 内存指针
    int poolIdx = -1;       // 使用的内存池索引
    QString timestamp = "";   // 分配时间戳
};

class PoolInfo
{
public:
    PoolInfo();
};

#endif // POOLINFO_H
